package com.tiantang.mybatis.helloworld.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.tiantang.mybatis.helloworld.domain.Employee;
import com.tiantang.mybatis.helloworld.mapper.EmployeeMapper;

/**
 * 
 * @description：功能描述 测试类1
 * @author： liujinkun
 * 创建时间： 2018年2月2日
 * @version：1.0
 * Copyright (c) 2018年
 */
public class MybatisTest1 {
	
	private static Logger logger=LoggerFactory.getLogger(MybatisTest1.class);
	
	public SqlSession session;
	
	@Test
	public void helloworld() throws IOException{
		String resource="mybatis-config.xml";
		InputStream inputStream=Resources.getResourceAsStream(resource);
		SqlSessionFactory sessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
		logger.info(sessionFactory.toString());
		
		SqlSession session =sessionFactory.openSession();
		Employee employee=session.selectOne("com.tiantang.mybatis.helloworld.mapper.EmployeeMapper.selectOne", 1);
		logger.info(employee.toString());
	}
	
	@Before
	public void before() throws IOException{
		String resource="mybatis-config.xml";
		InputStream inputStream=Resources.getResourceAsStream(resource);
		SqlSessionFactory sessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
		this.session=sessionFactory.openSession();
	}
	
	@Test
	public void testMapper(){
		//SqlSession的getMapper会为传入的接口类自动创建一个代理对象，让代理对象是实现接口的增删改查方法
		EmployeeMapper employeeMapper=session.getMapper(EmployeeMapper.class);
		Employee employee=employeeMapper.getEmployeeById(1l);
		logger.info(employee.toString());
	}
	
	/**
	 * 
	 * @description：功能描述 测试插入 
	 * 
	 * @author： liujinkun
	 * 创建时间： 2018年2月3日
	 * @see： 需要参见的其它内容
	 */
	@Test
	public void testInsert(){
		//SqlSession的getMapper会为传入的接口类自动创建一个代理对象，让代理对象是实现接口的增删改查方法
		EmployeeMapper employeeMapper=session.getMapper(EmployeeMapper.class);
		Employee employee=new Employee("王", "尼玛", "0", "1094274457@qq.com");
		logger.info("插入数据库之前employee的id="+employee.getId());
		boolean flag=employeeMapper.insert(employee);
		session.commit();
		logger.info(flag+"");
		logger.info("插入数据库之后的employee的id="+employee.getId());
		
	}

	/**
	 * 
	 * @description：功能描述	测试对参数查询 
	 * 
	 * @author： liujinkun
	 * 创建时间： 2018年2月3日
	 * @see： 需要参见的其它内容
	 */
	@Test
	public void testManyParameter(){
		//Cause: org.apache.ibatis.binding.BindingException: Parameter 'laseName' not found. Available parameters are [0, 1, param1, param2]
		//对于多参数查询时，MyBatis会将多个参数封装成一个Map，键为param1，param2.....或者参数的位置索引：0,1,2
		//如果需要用指定的字符串作为键，则需要在方法参数上加上注解：@Param("key")，key表示指定的键的值
		EmployeeMapper employeeMapper=session.getMapper(EmployeeMapper.class);
		Employee employee=employeeMapper.getByNameAndGender("刘", "0");
		logger.info(employee.toString());
	}
	
	/**
	 * 
	 * @description：功能描述 测试返回集合
	 * 
	 * @author： TianTang
	 * 创建时间： 2018年2月4日
	 * @see： 需要参见的其它内容
	 */
	@Test
	public void testGetList(){
		EmployeeMapper employeeMapper=session.getMapper(EmployeeMapper.class);
		List<Employee> employees=employeeMapper.getListByGender("0");
		logger.info(employees.size()+"");
		for (Employee employee : employees) {
			logger.info(employee.toString());
		}
	}
	
	/**
	 * 
	 * @description：功能描述 测试查询单条数据返回值封装成Map
	 * 
	 * @author： TianTang
	 * 创建时间： 2018年2月4日
	 * @see： 需要参见的其它内容
	 */
	@Test
	public void testReturnMap(){
		EmployeeMapper employeeMapper=session.getMapper(EmployeeMapper.class);
		Map<String,Object> map=employeeMapper.getEmployeeReturnMap(1l);
		logger.info(map.toString());
	}
	
	/**
	 * 
	 * @description：功能描述 测试查询多条数据返回封装成Map
	 * 
	 * @author： TianTang
	 * 创建时间： 2018年2月4日
	 * @see： 需要参见的其它内容
	 */
	@Test
	public void testReturnMap2(){
		EmployeeMapper employeeMapper=session.getMapper(EmployeeMapper.class);
		Map<Long,Employee> map=employeeMapper.getByGenderReturnMap("0");
		logger.info(map.toString());
	}
}
